//: concurrency/Joining.java
package concurrency; /* Added by Eclipse.py */

// Understanding join().
import static net.mindview.util.Print.*;

class Sleeper extends Thread {
	private int duration;

	public Sleeper(String name, int sleepTime) {
		super(name);
		duration = sleepTime;
		start();
	}

	public void run() {
		try {
			print(getName() + " going to sleep for " + duration + " millis" );
			sleep(duration);
		} catch (InterruptedException e) {
			print(getName() + " was interrupted. " + "isInterrupted(): " + isInterrupted());
			return;
		}
		print(getName() + " has awakened");
	}
}

class Joiner extends Thread {
	private Sleeper sleeper;

	public Joiner(String name, Sleeper sleeper) {
		super(name);
		this.sleeper = sleeper;
		start();
	}

	public void run() {
		try {
			print(getName() +" going to join "+sleeper);
			sleeper.join();
		} catch (InterruptedException e) {
			print("Interrupted");
		}
		print(getName() + " join completed");
	}
}

public class Joining {
	public static void main(String[] args) {
		Sleeper 
			sleepy = new Sleeper("Sleepy", 1500), 
			grumpy = new Sleeper("Grumpy", 1500);
		Joiner 
			dopey = new Joiner("Dopey", sleepy),
			doc = new Joiner("Doc", grumpy);
		grumpy.interrupt();
	}
} /* Output:
Grumpy was interrupted. isInterrupted(): false
Doc join completed
Sleepy has awakened
Dopey join completed
*///:~
